"""
演示：函数内改变全局变量
"""
num = 100
age=15


def test():
    # global关键字，在函数内声明变量为全局变量,若函数内变量和全局变量名字一样，默认是函数内的私有变量，
    global num
    num = 200
    print(f"函数内看到的num:{num},age:{age}")


test()
print(f"全局{num}")
print("------------------------------")

"""
传多个变量
"""
def add(x, y, z):
    result = x + y + z
    print(f"{x} + {y} + {z}的计算结果是：{result}")

# 调用函数，传入被计算的2个数字
add(5, 6, 7)
print("------------------------------")

"""
演示函数的多返回值示例
"""
def test_return():
    return 1, "hello", True

x, y, z = test_return()
print(x)
print(y)
print(z)
print("------------------------------")

"""
演示：定义函数返回值的语法格式
"""
# 定义一个函数，完成2数相加功能
def add(a, b):
    result = a + b
    # 通过返回值，将相加的结果返回给调用者
    return result
    # 返回结果后，还想输出一句话//前面return跳出函数了，后面不再执行
    print("我完事了")


# 函数的返回值，可以通过变量去接收
r = add(5, 6)
print(r)
print("------------------------------")

"""
演示特殊字面量：None
相当于js里的undefined
"""


# 无return语句的函数返回值
def say_hi():
    print("你好呀")


result = say_hi()
print(f"无返回值函数，返回的内容是：{result}")  # None
print(f"无返回值函数，返回的内容类型是：{type(result)}")


# 主动返回None的函数
def say_hi2():
    print("你好呀")
    return None


result = say_hi2()
print(f"无返回值函数，返回的内容是：{result}")
print(f"无返回值函数，返回的内容类型是：{type(result)}")


# None用于if判断
def check_age(age):
    if age > 18:
        return "SUCCESS"
    else:
        return None


result = check_age(16)
if not result:
    # 进入if表示result是None值 也就是False
    print("未成年，不可以进入")

# None用于声明无初始内容的变量
name = None
print("------------------------------")
"""
不定长定义的形式参数会作为 元组 存在，接收不定长数量的参数传入
"""
# 不定长 - 位置不定长, *号
def user_info(*args):
    print(f"args参数的类型是：{type(args)}，内容是:{args}")

user_info(1, 2, 3, '小明', '男孩')

# 不定长 - 关键字不定长, **号
def user_info(**kwargs):
    print(f"args参数的类型是：{type(kwargs)}，内容是:{kwargs}")
user_info(name='小王', age=11, gender='男孩')

print("------------------------------")
"""
演示：关键字参数
"""
def user_info(name, age, gender):
    print(f"姓名是:{name}, 年龄是:{age}, 性别是:{gender}")
# 位置参数 - 默认使用形式
user_info('小明', 20, '男')

# 关键字参数
user_info(name='小王', age=11, gender='女')
user_info(age=10, gender='女', name='潇潇')    # 可以不按照参数的定义顺序传参
user_info('甜甜', gender='女', age=9)


"""
演示lambda匿名函数
函数体只能有1行
"""

# 定义一个函数，接受其它函数输入
def test_func(compute):
    result = compute(1, 2)
    print(f"结果是:{result}")
# 通过lambda匿名函数的形式，将匿名函数作为参数传入
def add(x, y):
    return x + y
test_func(add)
test_func(lambda x, y: x + y) #和上面add一样